package question;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 问题7：多线程之间的比较
 *
 * @author 阳秋豪
 * @createTime 2024/3/12
 */
public class Test7 {
    /*在上一题基础上继续完成如下需求:
    在此次抽奖过程中，抽奖箱1总共产生了6个奖项
        分别为:10,20,100,500,2,300
        最高奖项为300元
        总计额为932元
    在此次抽奖过程中，抽奖箱2总共产生了6个奖项
        分别为:5,50,200,800,80,700
        最高奖项为800元
        总计额为1835元
    在此次抽奖过程中,抽奖箱2中产生了最大奖项,该奖项金额为800元
    核心逻辑:获取线程抽奖的最大值(看成是线程运行的结果
    以上打印效果只是数据模拟,实际代码运行的效果会有差异
    */
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建奖池
        ArrayList<Integer> arrayList = new ArrayList<>();
        Collections.addAll(arrayList, 10, 5, 20, 50, 100, 200, 500, 800, 2, 80, 300, 700);
        // 创建多线程要运行的参数对象
        Q7Callable callable = new Q7Callable(arrayList);
        // 创建多线程运行结果的管理者对象
        FutureTask<Integer> future1 = new FutureTask<>(callable);
        FutureTask<Integer> future2 = new FutureTask<>(callable);
        // 创建线程对象
        Thread t1 = new Thread(future1);
        Thread t2 = new Thread(future2);
        // 设置名字
        t1.setName("抽奖箱1");
        t2.setName("抽奖箱2");
        // 开启线程
        t1.start();
        t2.start();
        // 获取每个线程的最大奖金数比较
        Integer max1 = future1.get();
        Integer max2 = future2.get();
        if (max1 > max2) {
            System.out.println("在此次抽奖过程中,抽奖箱1中产生了最大奖项,该奖项金额为" + max1 + "元");
        } else {
            System.out.println("在此次抽奖过程中,抽奖箱2中产生了最大奖项,该奖项金额为" + max2 + "元");
        }
    }
}

class Q7Callable implements Callable<Integer> {
    ArrayList<Integer> arrayList;
    Random random = new Random();

    public Q7Callable(ArrayList<Integer> arrayList) {
        this.arrayList = arrayList;
    }

    @Override
    public Integer call() throws InterruptedException {
        ArrayList<Integer> list = new ArrayList<>();
        while (true) {
            synchronized (Q7Callable.class) {
                if (arrayList.isEmpty()) {
                    sout(list, Thread.currentThread().getName());
                    break;
                } else {
                    int i = random.nextInt(arrayList.size());
                    Integer remove = arrayList.remove(i);
                    list.add(remove);
                }
            }
            // 更好的看出来线程的交替
            Thread.sleep(10);
        }
        return Collections.max(list);
    }

    /**
     * 输出中奖号码
     *
     * @param list 抽奖箱
     * @param name 调用线程名
     */
    private void sout(ArrayList<Integer> list, String name) {
        System.out.println("在此次抽奖过程中，" + name + "总共产生了" + list.size() + "个奖项");
        System.out.println("\t分别为" + list);
        System.out.println("\t最大奖项是" + Collections.max(list));
        Integer sum = 0;
        for (Integer i : list) {
            sum += i;
        }
        System.out.println("\t总计额为" + sum + "元");
    }
}